package com.sxj.corejava.code07_面向对象.多态;

/**
 * @author 石小俊
 * @date 2025年01月07日
 */
public class Test {

    public static void main(String[] args) {
        // 对象的多态性:父类Person的引用指向了子类Man的对象
        // 编译时类型:等号左边,即Person
        // 运行时类型:等号右边,即Man
        Person person = new Man();
        // 此处运行时类型是子类,因此真正执行方法的是子类
        person.show();

        // 在子类中存在一个独有的方法work
        // 由于编译时类型是Person,而Person无法访问work方法
        // 因此,直接调用时报错
        // person.work();

        // 如果想要调用,则必须以Man的身份调用
        // 通过强制类型转换的方式调用
//        Man man = (Man) person;
//        man.work();
        // 简写
//        ((Man)person).work();
//
//        ((WoMan)person).shopping();

        // 使用向下转型时,需要判断当前对象是否可以进行转换
        // 即:当前对象的运行时类型是否是对应的转换后的类型
        // 如果是,则可以转换,否则无法转换
        // 语法:对象 instanceof 类型,返回值为boolean类型
        if (person instanceof Man) {
            System.out.println("该对象不是WoMan的对象,因此无法执行shopping方法");
            Man man = (Man) person;
            man.work();
        }
        if (person instanceof WoMan) {
            System.out.println("该对象不是Man的对象,因此无法执行work方法");
            WoMan woMan = (WoMan) person;
            woMan.shopping();
        }

        Person person2 = new WoMan();
        person2.show();
//        ((WoMan) person2).shopping();

        if (person2 instanceof Man) {
            System.out.println("该对象不是WoMan的对象,因此无法执行shopping方法");
            Man man = (Man) person2;
            man.work();
        }
        if (person2 instanceof WoMan) {
            System.out.println("该对象不是Man的对象,因此无法执行work方法");
            WoMan woMan = (WoMan) person2;
            woMan.shopping();
        }
    }

}
